package br.com.fafica.biblioteca.fachada;

import br.com.fafica.biblioteca.RepositorioException;
import br.com.fafica.biblioteca.funcionario.control.ControladorFuncionario;
import br.com.fafica.biblioteca.funcionario.model.Funcionario;
import br.com.fafica.biblioteca.funcionario.model.FuncionarioJaCadastradoException;
import br.com.fafica.biblioteca.funcionario.model.FuncionarioNaoEncontradoException;
import br.com.fafica.biblioteca.funcionario.model.IRepositorioFuncionario;
import br.com.fafica.biblioteca.funcionario.model.RepositorioFuncionarioArray;
import br.com.fafica.biblioteca.livro.control.ControladorLivro;
import br.com.fafica.biblioteca.livro.model.IRepositorioLivro;
import br.com.fafica.biblioteca.livro.model.Livro;
import br.com.fafica.biblioteca.livro.model.LivroJaCadastradoException;
import br.com.fafica.biblioteca.livro.model.LivroNaoEncontradoException;
import br.com.fafica.biblioteca.livro.model.RepositorioLivroArray;
import br.com.fafica.biblioteca.mensagem.control.ControladorMensagem;
import br.com.fafica.biblioteca.mensagem.model.IRepositorioMensagem;
import br.com.fafica.biblioteca.mensagem.model.Mensagem;
import br.com.fafica.biblioteca.mensagem.model.MensagemJacadastradaException;
import br.com.fafica.biblioteca.mensagem.model.MensagemNaoEncontradaException;
import br.com.fafica.biblioteca.mensagem.model.RepositorioMensagemArray;
import br.com.fafica.biblioteca.usuario.control.ControladorUsuario;
import br.com.fafica.biblioteca.usuario.model.IRepositorioUsuario;
import br.com.fafica.biblioteca.usuario.model.Usuario;
import br.com.fafica.biblioteca.usuario.model.UsuarioJaCadastradoException;
import br.com.fafica.biblioteca.usuario.model.UsuarioNaoEncontradoException;
import br.com.fafica.biblioteca.usuario.model.RepositorioUsuarioArray;





public class Fachada {
	
	private static Fachada instance = null;
	private IRepositorioLivro RepositorioLivroArray;
	private IRepositorioUsuario RepositorioUsuarioArray;
	private IRepositorioFuncionario RepositorioFuncionarioArray;
	private IRepositorioMensagem RepositorioMensagemArray;

	public Fachada(){
		
		this.RepositorioLivroArray = new RepositorioLivroArray();
		this.RepositorioUsuarioArray = new RepositorioUsuarioArray();
		this.RepositorioFuncionarioArray = new RepositorioFuncionarioArray();
		this.RepositorioMensagemArray = new RepositorioMensagemArray();
		
		
	}
	public static Fachada getInstance(){
		if (Fachada.instance == null){
			Fachada.instance = new Fachada();
		}
		return Fachada.instance;
	}
	
	//Livro
	public void cadastrarLivro(Livro livro)throws LivroJaCadastradoException, RepositorioException{
		ControladorLivro controladorLivro = new ControladorLivro(this.RepositorioLivroArray);
		controladorLivro.cadastrar(livro);
	}
	
	public Livro procurarLivro(String codigo) throws RepositorioException, LivroNaoEncontradoException{
		ControladorLivro controladorLivro = new ControladorLivro(this.RepositorioLivroArray);
		return controladorLivro.procurar(codigo);
	}
	public void atualizarLivro (Livro livro) throws RepositorioException, LivroNaoEncontradoException{
		ControladorLivro controladorLivro = new ControladorLivro(this.RepositorioLivroArray);
		controladorLivro.atualizar(livro);
	}

	public Livro removerLivro(String codigo) throws RepositorioException, LivroNaoEncontradoException{
		ControladorLivro controladorLivro = new ControladorLivro(this.RepositorioLivroArray);
		return controladorLivro.remover(codigo);
	}
	
	//Usuario	
	public void cadastrarUsuario(Usuario usuario)throws UsuarioJaCadastradoException, RepositorioException{
		ControladorUsuario controladorUsuario = new ControladorUsuario(this.RepositorioUsuarioArray);
		controladorUsuario.cadastrar(usuario);
	}
	
	public Usuario procurarUsuario(String codigo) throws RepositorioException, UsuarioNaoEncontradoException{
		ControladorUsuario controladorUsuario = new ControladorUsuario(this.RepositorioUsuarioArray);
		return controladorUsuario.procurar(codigo);
	}
	public void atualizarUsuario (Usuario usuario) throws RepositorioException, UsuarioNaoEncontradoException{
		ControladorUsuario controladorUsuario = new ControladorUsuario(this.RepositorioUsuarioArray);
		controladorUsuario.atualizar(usuario);
	}

	public Usuario removerUsuario(String codigo) throws RepositorioException, UsuarioNaoEncontradoException{
		ControladorUsuario controladorUsuario = new ControladorUsuario(this.RepositorioUsuarioArray);
		return controladorUsuario.procurar(codigo);
	}
	
	//Funcionario
	public void cadastrarFuncionario(Funcionario funcionario)throws FuncionarioJaCadastradoException, RepositorioException{
		ControladorFuncionario controladorFuncionario = new ControladorFuncionario(this.RepositorioFuncionarioArray);
		controladorFuncionario.cadastrar(funcionario);
	}
	
	public Funcionario procurarFuncionario(String codigo) throws RepositorioException, FuncionarioNaoEncontradoException{
		ControladorFuncionario controladorFuncionario = new ControladorFuncionario(this.RepositorioFuncionarioArray);
		return controladorFuncionario.procurar(codigo);
	}
	public void atualizarFuncionario (Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException{
		ControladorFuncionario controladorFuncionario = new ControladorFuncionario(this.RepositorioFuncionarioArray);
		controladorFuncionario.atualizar(funcionario);
	}

	public Funcionario removerFuncionario(String codigo) throws RepositorioException, FuncionarioNaoEncontradoException{
		ControladorFuncionario controladorFuncionario = new ControladorFuncionario(this.RepositorioFuncionarioArray);
		return controladorFuncionario.procurar(codigo);
	}
	
	//Mensagem
	public void cadastrarMensagem(Mensagem mensagem)throws MensagemJacadastradaException, RepositorioException{
		ControladorMensagem controladorMensagem = new ControladorMensagem(this.RepositorioMensagemArray);
		controladorMensagem.cadastrar(mensagem);
	}
	
	public Mensagem procurarMensagem(String codigo) throws RepositorioException, MensagemNaoEncontradaException{
		ControladorMensagem controladorMensagem = new ControladorMensagem(this.RepositorioMensagemArray);
		return controladorMensagem.procurar(codigo);
	}
	public void atualizarMensagem (Mensagem mensagem) throws RepositorioException, MensagemNaoEncontradaException{
		ControladorMensagem controladorMensagem = new ControladorMensagem(this.RepositorioMensagemArray);
		controladorMensagem.atualizar(mensagem);
	}

	public Mensagem removerMensagem(String codigo) throws RepositorioException, MensagemNaoEncontradaException{
		ControladorMensagem controladorMensagem = new ControladorMensagem(this.RepositorioMensagemArray);
		return controladorMensagem.procurar(codigo);
	}
	
	

}

